// 泛型 generic 泛指的类型
// 泛型只有在调用函数时往里传入类型才有类型约束
function join<T, P>(first: T, second: P) {
  return `${first}${second}`;
}

function anotherJoin<T>(first: T, second: T): T {
  return first;
}

// Array<T> 与 T[] 是一个意思
function map<T>(params: Array<T>) {
  return params;
}

join<number, string>(1, '1');
map<string>(['123']);

// 如果不写泛型约束，ts 会自己进行类型推断
join(1, '1');
